package model.dao;

import model.ConnectionFactory;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import model.beans.Usuario;

public class UsuarioDAO {

    private Connection con;
    private java.sql.PreparedStatement stmtInserir;
    private PreparedStatement stmtListar;
    private PreparedStatement stmtValidar;
    private PreparedStatement stmtBuscar;
    private PreparedStatement stmtBuscarPorCodigo;
    private PreparedStatement stmtDeletar;
    private PreparedStatement stmtAtualizar;
    
    
    public UsuarioDAO() throws Exception{
        con = ConnectionFactory.getConnection();
      }
    
    public UsuarioDAO(Connection con) throws Exception{
        this.con = con;
    }
    
    public void inserir(Usuario usuario) throws SQLException{
        stmtInserir = con.prepareStatement("INSERT INTO usuario(nome, matricula, tipo, email, login, senha) VALUES (?, ?, ?, ?, ?, ?);");
  
        stmtInserir.setString(1, usuario.getNome());
        stmtInserir.setString(2, usuario.getMatricula());
        stmtInserir.setInt(3, usuario.getTipo());
        stmtInserir.setString(4, usuario.getEmail());
        stmtInserir.setString(5, usuario.getLogin());
        stmtInserir.setString(6, usuario.getSenha());
        stmtInserir.executeUpdate();
    }
    
     public void deletar(int id) throws SQLException{
        stmtDeletar = con.prepareStatement("DELETE FROM usuario WHERE idUsuario = ? ;");
        stmtDeletar.setInt(1,id);
        stmtDeletar.executeUpdate();
        stmtDeletar.close();
    }
    
    public List<Usuario> listar() throws SQLException, ParseException{
        stmtListar = con.prepareStatement("SELECT * FROM usuario");
        ResultSet rs = stmtListar.executeQuery();
        List<Usuario> lista = new ArrayList();
        
        while(rs.next()){
            Usuario usuario = new Usuario();
            
            usuario.setidUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setMatricula(rs.getString("matricula"));
            usuario.setTipo(rs.getInt("tipo"));
            usuario.setEmail(rs.getString("email"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
            
            lista.add(usuario);
            }
            return lista;
        }
    
        public void atualizar(Usuario usuario) throws SQLException{
           stmtAtualizar = con.prepareStatement("UPDATE usuario SET nome = ? , matricula = ? , tipo = ? , email = ? , login = ? WHERE idUsuario = ? ;");
           
           stmtAtualizar.setString(1, usuario.getNome());
           stmtAtualizar.setString(2, usuario.getMatricula());
           stmtAtualizar.setInt(3, usuario.getTipo());
           stmtAtualizar.setString(4,usuario.getEmail());
           stmtAtualizar.setString(5, usuario.getLogin());
           stmtAtualizar.setInt(6, usuario.getidUsuario());
           stmtAtualizar.executeUpdate();   
        }
        
        public List<Usuario> buscar(String strBusca) throws SQLException, ParseException{
            stmtBuscar = con.prepareStatement("SELECT * FROM usuario WHERE nome like ? or matricula like ? or email like ? or login like ?");
            String str = "%" + strBusca + "%";
            stmtBuscar.setString(1, str);
            stmtBuscar.setString(2, str);
            stmtBuscar.setString(3, str);
            stmtBuscar.setString(4, str);
            
            ResultSet rs = stmtBuscar.executeQuery();
            List<Usuario> lista = new ArrayList();

            while(rs.next()){
                Usuario usuario = new Usuario();

                usuario.setidUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setMatricula(rs.getString("matricula"));
                usuario.setTipo(rs.getInt("tipo"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));

                lista.add(usuario);
                }
                return lista;
            }
        
        public Usuario buscarPorCodigo(int id) throws SQLException, ParseException{
            stmtBuscarPorCodigo = con.prepareStatement("SELECT * FROM usuario WHERE idUsuario = ? ;");
            stmtBuscarPorCodigo.setInt(1, id);
            ResultSet rs = stmtBuscarPorCodigo.executeQuery();
            
            Usuario usuario = new Usuario();
            
             if(rs.next()){
                 
                usuario.setidUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setMatricula(rs.getString("matricula"));
                usuario.setTipo(rs.getInt("tipo"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
             }
            return usuario;
        }
        
        public Usuario ValidaLogin(String login, String senha) throws SQLException{
            stmtValidar = con.prepareStatement("SELECT * FROM usuario WHERE login LIKE ? AND senha LIKE ? ;");
            Usuario usuario = new Usuario();

            stmtValidar.setString(1, login);
            stmtValidar.setString(2, senha);
            ResultSet rs = stmtValidar.executeQuery();

            if(rs.next()){

                usuario.setidUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setMatricula(rs.getString("matricula"));
                usuario.setTipo(rs.getInt("tipo"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
            }else{
                //login inválido!
                usuario.setidUsuario(0);
            }
            stmtValidar.close();
            return usuario;
        }

    
        @Override
        public void finalize() throws Throwable{
            super.finalize();
            stmtInserir.close();
            stmtDeletar.close();
            stmtAtualizar.close();
            stmtListar.close();
            stmtValidar.close();
            stmtBuscar.close();
            con.close();
        }

    }
    
